<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>360&deg; MP3 player UI demo (SoundManager 2): Javascript + Canvas Visualization</title>
<meta name="description" content="Javascript + Canvas + SoundManager 2: 360-degree circular control / jog wheel example for playing MP3 links, with EQ and spectrum visualization options" />
<!-- demo, make the fonts nicer etc. -->
<link rel="stylesheet" type="text/css" href="../index.css" />

<!-- soundManager.useFlashBlock: related CSS -->
<link rel="stylesheet" type="text/css" href="../flashblock/flashblock.css" />

<!-- required -->
<link rel="stylesheet" type="text/css" href="360player.css" />
<link rel="stylesheet" type="text/css" href="360player-visualization.css" />

<!-- special IE-only canvas fix -->
<!--[if IE]><script type="text/javascript" src="script/excanvas.js"></script><![endif]-->

<!-- Apache-licensed animation library -->
<script type="text/javascript" src="script/berniecode-animator.js"></script>

<!-- the core stuff -->
<script type="text/javascript" src="../../script/soundmanager2.js"></script>
<script type="text/javascript" src="script/360player.js"></script>

<script type="text/javascript">

soundManager.setup({
  // path to directory containing SM2 SWF
  url: '../../swf/'
});

threeSixtyPlayer.config.scaleFont = (navigator.userAgent.match(/msie/i)?false:true);
threeSixtyPlayer.config.showHMSTime = true;

// enable some spectrum stuffs

threeSixtyPlayer.config.useWaveformData = true;
threeSixtyPlayer.config.useEQData = true;

// enable this in SM2 as well, as needed

if (threeSixtyPlayer.config.useWaveformData) {
  soundManager.flash9Options.useWaveformData = true;
}
if (threeSixtyPlayer.config.useEQData) {
  soundManager.flash9Options.useEQData = true;
}
if (threeSixtyPlayer.config.usePeakData) {
  soundManager.flash9Options.usePeakData = true;
}

if (threeSixtyPlayer.config.useWaveformData || threeSixtyPlayer.flash9Options.useEQData || threeSixtyPlayer.flash9Options.usePeakData) {
  // even if HTML5 supports MP3, prefer flash so the visualization features can be used.
  soundManager.preferFlash = true;
}

// favicon is expensive CPU-wise, but can be used.
if (window.location.href.match(/hifi/i)) {
  threeSixtyPlayer.config.useFavIcon = true;
}

if (window.location.href.match(/html5/i)) {
  // for testing IE 9, etc.
  soundManager.useHTML5Audio = true;
}

</script>

<!-- DEMO only, customization UI: Yahoo! YUI colorpicker stuff -->
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/slider/assets/skins/sam/slider.css" />
<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.7.0/build/colorpicker/assets/skins/sam/colorpicker.css" />
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/animation/animation-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/dragdrop/dragdrop-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/slider/slider-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/element/element-min.js"></script>
<script type="text/javascript" src="http://yui.yahooapis.com/2.7.0/build/colorpicker/colorpicker-min.js"></script>

<link rel="stylesheet" type="text/css" href="demo.css" />
<style type="text/css">

body {
 background-image: none;
}

#left h2 {
 padding-top:0px;
 margin-bottom:0.25em;
 color:#666;
}

pre.block {
 margin-top:0.5em;
}

/* special case */

#left {
 width:auto;
 max-width:100%;
}

.ui360 span {
 vertical-align: top;
}

</style>

<!-- demo configuration stuff, you don't need this -->
<link rel="stylesheet" type="text/css" href="demo-slider-controls.css" />
<script type="text/javascript" src="demo-slider-controls.js"></script>

</head>

<body>
	
<div id="left">

 <h1><a href="http://www.schillmania.com/projects/soundmanager2/" title="Javascript MP3 player project home">SoundManager 2</a> / <a href="http://schillmania.com/projects/soundmanager2/demo/360-player/">360&deg; Player Demo</a>: JS + Canvas Visualization</h1>

 <p class="note" style="color:#666;margin-top:0.5em;margin-bottom:0.5em">Canvas-based UI with visualization options. <b>Note: Spectrum/EQ visualizations disabled for IE &lt; 9 (too slow.) Data is not implemented under HTML5.</b></p>
 <p class="note" style="color:#666;margin-bottom:0.5em">You can also <a href="#debug=1" onclick="window.location.href = this.href;window.location.reload()" title="Enable debug mode, show frames per second">show FPS</a><span id="config-link"> or <a href="#customize" onclick="window.location.href=this.href;window.location.reload()">customize the UI</a></span><span id="hifi">, or see the <a href="#hifi=1" onclick="window.location.href=this.href;window.location.reload()">hi-fi version</a></span>. Check the <a href="canvas-visualization-basic.html">basic template</a> for a minimal code example; also see the <a href="../360-player/" title="360&deg; player UI">default 360&deg; UI</a>.</p>

	<!-- customization crap -->

	<div id="config-ui" style="clear:both;position:relative;max-width:1110px;margin-top:1em;display:none">

		<div style="position:relative">

			<form action="#" method="get">

				<div id="controls">

			  <div class="checkbox">
			   <div>
			    <input id="use-waveform" type="checkbox" checked="checked" title="Enable waveform feature." onclick="controller.updateExample();controller.updateExampleCode()" value="Apply" /> Waveform
			    <input id="disabled-1" type="checkbox" title="Enable EQ (spectrum) feature." onclick="controller.updateExample();controller.updateExampleCode()" value="Apply" style="margin-left:1em" checked="checked" /> EQ
			    <input type="checkbox" name="use-amplifier" id="use-amplifier" checked="checked" onclick="controller.updateExample();controller.updateExampleCode()" style="margin-left:1em"> Amplifier
			   </div>
			  </div>

			  <div style="clear:left"></div>

			  <dl class="col">

			   <dt>Circle Diameter</dt>
			   <dd class="title">Size</dd>
			   <dd>1-256</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Size of circle"></div>
			   </dd>

			   <dt>Waveform Thickness</dt>
			   <dd class="title">thickness</dd>
			   <dd>1-100</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Thickness of line"></div>
			   </dd>

			   <dt>Wave Downsample</dt>
			   <dd class="title">(Scale)</dd>
			   <dd>1-16</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Amount to downsample waveform data by"></div>
			   </dd>

			   <dt>EQ Thickness</dt>
			   <dd class="title">thickness</dd>
			   <dd>1-50</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Thickness of line"></div>
			   </dd>

			   <dt>EQ Downsample</dt>
			   <dd class="title">(Scale)</dd>
			   <dd>1-16</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Amount to downsample EQ data by"></div>
			   </dd>

			   <dt>Ring Thickness</dt>
			   <dd class="title">(Scale)</dd>
			   <dd>1-200</dd>
			   <dd class="control">
			    <div class="bar" title="Click to move here"></div>
			    <div class="slider" title="Scale factor for the ring width"></div>
			   </dd>

			  </dl>

			  <div id="options" class="col">

			   <div>
				Waveform position:
			    <input type="radio" name="waveform-inside" id="waveform-inside" value="true" checked="checked" onclick="controller.updateExample();controller.updateExampleCode()"> Inside | <input type="radio" name="waveform-inside" id="waveform-inside" value="false" onclick="controller.updateExample();controller.updateExampleCode()"> Outside
			   </div>

			   <div>
				EQ position:
			    <input type="radio" name="eq-inside" id="eq-inside" value="true" onclick="controller.updateExample();controller.updateExampleCode()"> Inside | <input type="radio" name="eq-inside" id="eq-inside" value="false" checked="checked" onclick="controller.updateExample();controller.updateExampleCode()"> Outside
			   </div>

			   <div>
				Waveform color:
				<input type="text" name="waveform-color" id="waveform-color" value="#000000" onclick="createCP(this,setWaveformColor)" />
			   </div>

			   <div>
				EQ color:
				<input type="text" name="eq-color" id="eq-color" value="#000000" onclick="createCP(this,setEQColor)" />
			   </div>

			   <div>
				Loaded ring color:
				<input type="text" name="loaded-ring-color" id="loaded-ring-color" value="#000000" onclick="createCP(this,setLoadedRingColor)" />
			   </div>

			   <div>
				Progress ring color:
				<input type="text" name="progress-ring-color" id="progress-ring-color" value="#000000" onclick="createCP(this,setProgressRingColor)" />
			   </div>

			   <div>
				Background ring color:
				<input type="text" name="bg-ring-color" id="bg-ring-color" value="#000000" onclick="createCP(this,setBackgroundRingColor)" />
			   </div>
		
			   <p class="compact">
			    <input type="button" onclick="controller.randomize()" value="Randomize controls" title="Assign random control values" style="font-size:x-small" />
			   </p>

			</form>
	
		  </div>

		  <div id="cp-container">
		  <!-- color picker stuff goes here -->
		  </div>
	
		  <div id="config-code-block" style="float:right;display:inline;margin-left:1em;margin-top:-0.7em">
			<!--
			<pre id="config-link" class="block"><code style="cursor:pointer" onclick="document.getElementById('config-link').style.display='none';document.getElementById('config-pre-block').style.display='block';return false"> [click to show code]                 </code></pre>
		-->
	<pre id="config-pre-block" class="block"><code id="config-code">Code goes here</code></pre>
		  </div>

		 </div>

		</div>
		
		<p style="clear:left">Get a sound playing, then adjust the values to see real-time updates.</p>

	</div>

		<!-- here are the MP3 links, which are decorated with the 360 canvas element/UI etc. -->
		
		<div id="sm2-container">
			<!-- sm2 flash goes here -->
		</div>

	 	<h2 style="margin-top:1em">Inline list</h2>

		<div class="sm2-inline-list"> <!-- remove this class to have one item per line -->

			<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/The%20Fugitives%20-%20Graffiti%20Sex.mp3">The Fugitives - Graffiti Sex</a></div>
			<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/Adrian%20Glynn%20-%20Blue%20Belle%20Lament.mp3">Adrian Glynn - Blue Belle Lament</a></div>
			<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/SonReal%20-%20I%20Tried.mp3">SonReal - I Tried</a></div>
			<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/SonReal%20-%20People%20Asking.mp3">SonReal - People Asking</a></div>
			<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/mpc/20060826%20-%20Armstrong.mp3">20060826 - Armstrong Groove</a></div>

	   	</div>
	
		<p class="note medium-note" style="clear:both"><b>Artist thank-yous</b>: "Graffiti Sex" courtesy of <a href="http://www.fugitives.ca/" title="A group of musicians, poets, and multi-instrumentalists from Vancouver, Canada">The Fugitives</a>. "Blue Belle Lament" courtesy of <a href="http://www.adrianglynn.com/" title="Adrian Glynn, Vancouver-based Singer/Songwriter">Adrian Glynn</a>. "I Tried" and "People Asking" courtesy of <a href="http://sonreal.bandcamp.com/album/the-lightyear-mixtape" title="The Lightyear Mixtape from SonReal, Vancouver-based hip-hop artist">SonReal</a>.</p>

	 	<h2 style="clear:left;padding-top:1em">Block list</h2>

		<div>
	     	<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/gong-192kbps.mp3">32" Chau Gong Sounds</a></div>
	     	<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/mpc/20090207%20-%20Loverman.mp3">20090207 - Loverman</a></div>
		 	<div class="ui360 ui360-vis"><a href="http://freshly-ground.com/data/audio/sm2/dialup.mp3">56K Modem dial-up sound (Warning: <span style="color:#ff3333">LOUD</span>)</a></div>
		 	<div class="ui360 ui360-vis"><a href="../../demo/_mp3/1hz-10khz-sweep.mp3">1-10 Khz Sweep (Warning: <span style="color:#ff3333">LOUD</span>)</a></div>
			<div class="ui360 ui360-vis"><a href="../../demo/_mp3/sine,%20square,%20sawtooth,%20rando.mp3">Sine, Square, Sawtooth, Wave (Warning: <span style="color:#ff3333">LOUD</span>)</a></div>
		</div>

		<p class="note medium-note" style="clear:left">56K Modem sound (Creative Commons license) via <a href="http://www.freesound.org/samplesViewSingle.php?id=16475">dialup.mp3</a>, from freesound.org user <a href="http://www.freesound.org/usersViewSingle.php?id=54447">Jlew</a>.</p>

		
		<h2 style="clear:left;padding-top:1em">Variant: Annotations/meta-data</h2>


		 <ul class="ui360playlist">

		  <li>

		   <div class="ui360 ui360-vis">
		    <a href="http://freshly-ground.com/data/audio/binaural/A%20Virtual%20Haircut%20in%20San%20Francisco%20%283%20Scenes%29.mp3">A Virtual Haircut (3 scenes)</a>
		    <div class="metadata">
		     <div class="duration">4:43</div> <!-- total track time (for positioning while loading, until determined -->
		     <ul>
		      <li><p>Electric razor</p><span>0:00</span></li> <!-- first scene -->
		      <li><p>Water, scissors</p><span>2:41</span></li> <!-- start time of second scene -->
		      <li><p>More razor work</p><span>4:00</span></li>
		     </ul>
		    </div>
		   </div>

		  </li>

		  <li>

		   <div class="ui360 ui360-vis">
		    <a href="http://freshly-ground.com/data/audio/binaural/Rubber%20Chicken%20Launch%20%28office%29.mp3">Rubber Chicken Launch (Office)</a>

			   <div class="metadata">
			    <div class="duration">0:47</div>
			    <ul>
			     <li><p>First attempt</p><span>0:00</span></li>
			     <li><p>Fire!</p><span>0:02</span></li>
			     <li><p>"Too much angle"</p><span>0:05</span></li>
			     <li><p>Random chicken noise</p><span>0:18</span></li>
			     <li><p>"Wait a second"</p><span>0:31</span></li>
			     <li><p>Derrr..</p><span>0:34</span></li>
			     <li><p>Launch attempt #2</p><span>0:36</span></li>
			     <li><p>"Wrong angle"</p><span>0:39</span></li>
			     <li><p>"Fail"</p><span>0:42</span></li>
			    </ul>
			   </div>


		   </div>

		  </li>

		 </ul>

	<div style="clear:both"></div>
	
	 <p style="margin-left:1em">
	  <a href="http://www.schillmania.com/projects/soundmanager2/" title="SoundManager 2 home">SoundManager 2 project page</a> (not an MP3 link)
	 </p>
	
	<script type="text/javascript">
	  if (window.location.toString().match(/#customize/i)) {
		document.getElementById('config-link').style.display = 'none';
	    document.getElementById('config-ui').style.display = 'block';	
	  }
	</script>

</div>

</body>
</html>
